{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a target=\"_blank\" href=\"https://colab.research.google.com/github/cohere-ai/notebooks/blob/main/notebooks/What_Is_Similarity_Between_Sentences.ipynb\">\n",
    "  <img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/>\n",
    "</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "psRggLwvhi1E"
   },
   "source": [
    "# Similarity Between Words and Sentences\n",
    "\n",
    "Sentence embeddings are the bread and butter of language models, as they associate each sentence with a particular list of numbers (a vector), in a way that similar sentences give similar vectors. We can think of embeddings as a way to locate each sentence in space (a high dimensional space, but a space nonetheless), in a way that similar sentences are located close by. Once we have each sentence somewhere in space, it’s natural to think of distances between them. And an even more intuitive way to think of distances is to think of similarities, i.e., a score assigned to each pair of sentences, which is high when these sentences are similar, and low when they are different. The similarity is a very useful concept in large language models, as it can be used for search, for translation, for summarization, and in many other applications. \n",
    "\n",
    "In this notebook, we understand the intuition behind similarities between sentences, including dot product and cosine similarity.\n",
    "\n",
    "_Read the accompanying [blog post here](https://docs.cohere.com/docs/similarity-between-words-and-sentences)._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overview\n",
    "\n",
    "We'll do the following steps:\n",
    "- **Step 1: Turn Text into Embeddings** - Use Cohere's Embed endpoint to get sentence embeddings.\n",
    "- **Step 2: Calculate Dot Products** - Calculate the dot products between each pair of sentence embeddings to understand similarity between them.\n",
    "- **Step 3: Calculate Cosine Similarities** - Use scikit-learn to get the cosine similarity for each pair of sentence embeddings."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup\n",
    "\n",
    "We'll start by installing the tools we'll need and then importing them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "! pip install cohere -q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "Zg5H7gd7V0Mu"
   },
   "outputs": [],
   "source": [
    "import cohere\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import altair as alt\n",
    "from sklearn.metrics.pairwise import cosine_similarity"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fill in your Cohere API key in the next cell. To do this, begin by [signing up to Cohere](https://os.cohere.ai/) (for free!) if you haven't yet. Then get your API key [here](https://dashboard.cohere.com/api-keys)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Paste your API key here. Remember to not share publicly\n",
    "co = cohere.Client(\"COHERE_API_KEY\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4_YQVuAbf3Xh"
   },
   "source": [
    "## Step 1: Turn Text into Embeddings\n",
    "\n",
    "In this notebook, we'll work with three sentences and store them in a Python list `texts`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "texts = [\"I like to be in my house\", \n",
    "         \"I enjoy staying home\", \n",
    "         \"the isotope 238u decays to 206pb\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To get the corresponding sentence embeddings, we call the [Embed endpoint](https://docs.cohere.com/reference/embed) with `co.embed()`. We supply three parameters:\n",
    "- `texts` - our list of sentences\n",
    "- `model` - we use `embed-english-v3.0`, Cohere's latest (at the time of writing) English-only embeddings model to generate the embeddings\n",
    "- `input_type` - we use `search_document` to indicate that we intend to use the embeddings for search use-cases\n",
    "\n",
    "You'll learn about these parameters in more detail in the [LLMU Module on Text Representation](https://docs.cohere.com/docs/intro-text-representation)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "6HujlbFsIZjW"
   },
   "outputs": [],
   "source": [
    "response = co.embed(\n",
    "    texts=texts,\n",
    "    model='embed-english-v3.0',\n",
    "    input_type='search_document'\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The embeddings are stored in the `embeddings` value of the response. After getting the embeddings, we separate them by sentence."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "QIZoRxXVNPQY",
    "outputId": "9b73065b-098e-44e3-c21d-e30b3a0f9fe2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Embedding for sentence 1 [ 0.04968262  0.03799438 -0.02963257 ... -0.0737915  -0.0079422\n",
      " -0.01863098]\n",
      "Embedding for sentence 2 [ 0.043396    0.05401611 -0.02461243 ... -0.06216431 -0.0196228\n",
      " -0.00948334]\n",
      "Embedding for sentence 3 [ 0.0243988   0.00712967 -0.04669189 ... -0.03903198 -0.02403259\n",
      "  0.01942444]\n"
     ]
    }
   ],
   "source": [
    "embeddings = response.embeddings\n",
    "\n",
    "[sentence1, sentence2, sentence3] = embeddings\n",
    "\n",
    "print(\"Embedding for sentence 1\", np.array(sentence1))\n",
    "print(\"Embedding for sentence 2\", np.array(sentence2))\n",
    "print(\"Embedding for sentence 3\", np.array(sentence3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9pR9yDy1ot17"
   },
   "source": [
    "Note that the embeddings are vectors (lists) of 1024 numbers, so they are truncated here (thus the dots in between).  One would expect that the vectors corresponding to sentences 1 and 2 are similar to each other and that both are different from the vector corresponding to sentence 3. However, from inspection, this is not very clear. We need to calculate some similarities to see if this is the case.  We will do that in the following two sections.\n",
    "\n",
    "## Step 2: Calculate Dot Products\n",
    "\n",
    "Let’s calculate the dot products between the three sentences to understand how similar they are to each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "8b-FViGlJQLe",
    "outputId": "9eec0fc0-2f2c-43c6-c4ac-389e9ea671ee"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Similarity between sentences 1 and 2: 0.818827121924668\n",
      "Similarity between sentences 1 and 3: 0.19770800712384107\n",
      "Similarity between sentences 2 and 3: 0.19897217756830138\n"
     ]
    }
   ],
   "source": [
    "print(\"Similarity between sentences 1 and 2:\", np.dot(sentence1, sentence2))\n",
    "print(\"Similarity between sentences 1 and 3:\", np.dot(sentence1, sentence3))\n",
    "print(\"Similarity between sentences 2 and 3:\", np.dot(sentence2, sentence3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The similarity between sentences 1 and 2 (0.8188) is much larger than the similarities between the other pairs. This confirms our predictions.\n",
    "\n",
    "Just for consistency, let’s calculate the similarities between each sentence and itself, to confirm that a sentence and itself has the highest similarity score."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "sb-MX-MdhlPj",
    "outputId": "4437d83b-7857-4dc3-d6cc-06d32b91aeb2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Similarity between sentences 1 and 1: 0.9994656785851899\n",
      "Similarity between sentences 2 and 2: 1.0006820582016114\n",
      "Similarity between sentences 3 and 3: 1.0005095878377965\n"
     ]
    }
   ],
   "source": [
    "print(\"Similarity between sentences 1 and 1:\", np.dot(sentence1, sentence1))\n",
    "print(\"Similarity between sentences 2 and 2:\", np.dot(sentence2, sentence2))\n",
    "print(\"Similarity between sentences 3 and 3:\", np.dot(sentence3, sentence3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This checks out—the similarity between a sentence and itself is around 1, which is higher than all the other similarities."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DWEpWsI0o8gn"
   },
   "source": [
    "## Step 3: Calculate Cosine Similarities\n",
    "\n",
    "We use the `cosine_similarity()` function from scikit-learn to measure cosine similarity between the three sentences."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "D4ZkpwMSL_oH",
    "outputId": "08252157-d689-45af-9210-0802d2a073ed"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cosine similarity between sentences 1 and 2: 0.818766792354783\n",
      "Cosine similarity between sentences 1 and 3: 0.1977104790996451\n",
      "Cosine similarity between sentences 2 and 3: 0.19885369669720415\n"
     ]
    }
   ],
   "source": [
    "print(\"Cosine similarity between sentences 1 and 2:\", cosine_similarity([sentence1], [sentence2])[0][0])\n",
    "print(\"Cosine similarity between sentences 1 and 3:\", cosine_similarity([sentence1], [sentence3])[0][0])\n",
    "print(\"Cosine similarity between sentences 2 and 3:\", cosine_similarity([sentence2], [sentence3])[0][0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let’s check the similarity between each sentence and itself. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "tZ7ls1JlkngY",
    "outputId": "8d28b53b-08f0-44dd-9498-671d1d35f27f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cosine similarity between sentences 1 and 1: 0.9999999999999998\n",
      "Cosine similarity between sentences 2 and 2: 1.0000000000000004\n",
      "Cosine similarity between sentences 3 and 3: 1.0000000000000004\n"
     ]
    }
   ],
   "source": [
    "print(\"Cosine similarity between sentences 1 and 1:\", cosine_similarity([sentence1], [sentence1])[0][0])\n",
    "print(\"Cosine similarity between sentences 2 and 2:\", cosine_similarity([sentence2], [sentence2])[0][0])\n",
    "print(\"Cosine similarity between sentences 3 and 3:\", cosine_similarity([sentence3], [sentence3])[0][0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also plot the results in a grid."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 457
    },
    "id": "sO3AxCUJq7AH",
    "outputId": "7118f5f8-7a78-4607-e31f-e08f4b23e5e3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Text(0.5, 0, 'I like to be in my house'),\n",
       " Text(1.5, 0, 'I enjoy staying home'),\n",
       " Text(2.5, 0, 'the isotope 238u decays to 206pb')]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuMAAAJHCAYAAAA68FhcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAACLtklEQVR4nOzddXhU19bH8W+MJARCIEjw4FI8uBSKpWhpKQ7BvbgGJxS34FIkOBR3Le4QAqWUUrQUGlwCJITIvH/wZm4GgrWBmZDf5z7zXHLmyD4zpzNr1ll7byuDwWBAREREREQ+OWtzN0BEREREJL5SMC4iIiIiYiYKxkVEREREzETBuIiIiIiImSgYFxERERExEwXjIiIiIiJmomBcRERERMRMFIyLiIiIiJiJgnERERERETNRMC4iIiIiYiYKxkVEREQk3tu/fz81atQgTZo0WFlZsW7dundus2/fPjw8PHBwcCBz5szMnDnzg4+rYFxERERE4r1nz56RP39+pk6d+l7rX716lapVq1KmTBkCAgLo168fnTt3ZvXq1R90XCuDwWD4Nw0WEREREfkcWVlZsXbtWmrVqvXGdfr06cOGDRs4f/68cVm7du04c+YMR44cee9jKTMuIiIiIp+l0NBQgoKCTB6hoaGxsu8jR45QuXJlk2Wenp6cPHmSsLCw996Pbay0RkTitKFDh5q7CSIiEkcMHjz4ox8j7N6VWNnPyKkLX/uOGzx4MEOGDPnP+7516xapUqUyWZYqVSrCw8O5d+8eqVOnfq/9KBgXERERkc+St7c33bt3N1lmb28fa/u3srIy+Tuq+vvV5W+jYFxEjPp1bGLuJoiZjZi2yPjv3lnDzdgSsRRjLv0vVDgx97gZWyKWoEjLop/mQJERsbIbe3v7WA2+o3Nzc+PWrVsmy+7cuYOtrS2urq7vvR8F4yIiIiJiWQyR5m7BO5UoUYKNGzeaLNuxYweFCxfGzs7uvfejDpwiIiIiEu89ffqU06dPc/r0aeDl0IWnT5/m+vXrwMuSFy8vL+P67dq146+//qJ79+6cP3+eefPmMXfuXHr27PlBx1VmXEREREQsS+Snz4yfPHmSr776yvh3VK1506ZN8fPzIzAw0BiYA2TKlIktW7bQrVs3pk2bRpo0aZg8eTK1a9f+oOMqGBcRERERi2IwQ5lKuXLleNv0O35+fq8tK1u2LKdOnfpPx1WZioiIiIiImSgzLiIiIiKWxQxlKuaiYFxERERELEscGE0ltigYFxERERHLEkvjjMcFqhkXERERETETZcZFRERExLKoTEVERERExEziUQdOlamIiIiIiJiJMuMiIiIiYlHMMemPuSgYFxERERHLojIVERERERH52JQZFxERERHLojIVEREREREz0aQ/IiIiIiLysSkzLiIiIiKWRWUqIiIiIiJmEo9GU1EwLiIiIiKWJR5lxlUzLiIiIiJiJsqMi4iIiIhlUZmKiIiIiIh5GAwa2lBERERERD4yZcZFRERExLLEow6cCsZFRERExLLEo5pxlamIiIiIiJiJMuMiIiIiYllUpiIiIiIiYiaRGk1FREREREQ+MmXGRURERMSyqExFRERERMRM4tFoKgrGRURERMSyxKPMuGrGRURERETMRJlxEREREbEsKlMRERERETGTeBSMq0xFRERERMRMlBkXEREREYtiMMSfSX8UjIuIiIiIZVGZioiIiIiIfGzKjIuIiIiIZYlH44wrGBcRERERy6IyFRERERER+diUGRcRERERy6IyFRERERERM4lHZSoKxkVERETEssSjzLhqxkVEREREzESZcRERERGxLCpTERERERExk3gUjKtMRURERETETJQZFxERERHLog6c8qn4+fnh4uJi/HvIkCEUKFDA+HezZs2oVavWJ2/X+yhXrhxdu3aN9f1aWVmxbt26WN/vx+Du7o6vr6+5myEiIvJ5iYyMnUccoGD8I/vQYLpnz5788ssvH609165dw8rKitOnT3+0Y/xXgYGBVKlSxdzNEBEREfnoVKZiYRIlSkSiRInM3QyzcnNzM3cTRERExJxUpiLm8mqZyqv8/f1JmTIlw4cPB+Dx48e0adOGlClT4uzsTPny5Tlz5swbt8+UKRMABQsWxMrKinLlygEQGRmJj48P6dKlw97engIFCrBt27Z3tjc8PJwffvgBFxcXXF1dGTBgAAaDwfj8ixcv6N27N2nTpsXJyYlixYqxd+/et+4zeplKVCZ/zZo1fPXVVyRMmJD8+fNz5MiRd+5j1qxZVK9enYQJE5IrVy6OHDnCpUuXKFeuHE5OTpQoUYLLly8bj2Ntbc3JkydN9jNlyhQyZsxock6vCg4OpkWLFiROnJgMGTIwe/Zsk+fPnj1L+fLlcXR0xNXVlTZt2vD0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m/fex1NmXEREREQsirky4ytWrKBr165Mnz6dUqVKMWvWLKpUqcLvv/9OhgwZYtymbt263L59m7lz55I1a1bu3LlDeHj4ex9TwbiIiIiIWBRzBeMTJkygZcuWtGrVCgBfX1+2b9/OjBkzGDly5Gvrb9u2jX379nHlyhWSJUsGgLu7+wcdU2UqIiIiIvJZCg0NJSgoyOQRGhoa47ovXrzA39+fypUrmyyvXLkyhw8fjnGbDRs2ULhwYcaMGUPatGnJnj07PXv2JCQk5L3bqGBcRERERCyLwSpWHiNHjiRJkiQmj5gy3AD37t0jIiKCVKlSmSxPlSoVt27dinGbK1eucPDgQX777TfWrl2Lr68vq1atomPHju99qipTERERERGLEltlKt7e3nTv3t1kmb29/Vu3sbKyMm2LwfDasiiRkZFYWVmxZMkSkiRJArwsdfn++++ZNm0ajo6O72yjgnERERERsSiGyJiD3w9lb2//zuA7SvLkybGxsXktC37nzp3XsuVRUqdOTdq0aY2BOECuXLkwGAzcuHGDbNmyvfO4KlMRERERkXgvQYIEeHh4sHPnTpPlO3fupGTJkjFuU6pUKf755x+ePn1qXPbnn39ibW1NunTp3uu4CsZFRERExKIYImPn8aG6d+/OnDlzmDdvHufPn6dbt25cv36ddu3aAS/LXry8vIzrN2zYEFdXV5o3b87vv//O/v376dWrFy1atHivEhVQmYqIiIiIWBiDIXbKVD5UvXr1uH//Pj4+PgQGBpInTx62bNlCxowZAQgMDOT69evG9RMlSsTOnTvp1KkThQsXxtXVlbp16/Ljjz++9zEVjIuIiIiI/L8OHTrQoUOHGJ/z8/N7bVnOnDlfK235EArGRURERMSimGvSH3NQMC4iIiIiFiW2RlOJC9SBU0RERETETJQZFxERERGLYjCYuwWfjoJxEREREbEoKlMREREREZGPTplxEREREbEo8SkzrmBcRERERCyKasZFRERERMwkPmXGVTMuIiIiImImyoyLiIiIiEUxGOJPZlzBuIiIiIhYFEOkuVvw6ahMRURERETETJQZFxERERGLEqkyFRERERER84hPNeMqUxERERERMRNlxkVERETEosSnccYVjIuIiIiIRYlPM3CqTEVERERExEyUGRcRERERi6IyFRERERERM9HQhiIiIiIiZqKhDUVE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mW792rVrsb5PT09PPD09Y32/IiIi8n5iHnz586QOnCIiIiIiZqLMuIiIiIhYFAMqUxERERERMYvIeDTWn8pURERERETMRJlxEREREbEokSpTERERERExj/hUM64yFRERERERM1FmXEREREQsSnwaZ1zBuIiIiIhYlPhUpqJgXEREREQsSnzKjKtmXERERETETJQZFxERERGLEp8y4wrGRURERMSixKeacZWpiIiIiIiYiTLjIiIiImJRIuNPYlzBuIiIiIhYlkiVqYiIiIiIyMemzLiIiIiIWBSDuRvwCSkYFxERERGLEp+GNlSZioiIiIiImSgzLiIiIiIWJdIq/nTgVDAuIiIiIhZFNeMiIiIiImaimnEREREREfnolBkXEREREYsSn2bgVGZcRERERCxKJFax8vg3pk+fTqZMmXBwcMDDw4MDBw6813aHDh3C1taWAgUKfNDxFIyLiIiIiAArVqyga9eu9O/fn4CAAMqUKUOVKlW4fv36W7d7/PgxXl5eVKhQ4YOPqWBcRERERCyKIZYeH2rChAm0bNmSVq1akStXLnx9fUmfPj0zZsx463Zt27alYcOGlChR4oOPqWBcRERERCxKpFXsPEJDQwkKCjJ5hIaGxnjMFy9e4O/vT+XKlU2WV65cmcOHD7+xrfPnz+fy5csMHjz4X52rgnERERER+SyNHDmSJEmSmDxGjhwZ47r37t0jIiKCVKlSmSxPlSoVt27dinGbixcv0rdvX5YsWYKt7b8bF0WjqYiIiIiIRYmtcca9vb3p3r27yTJ7e/u3bmP1yuyfBoPhtWUAERERNGzYkKFDh5I9e/Z/3UYF4yIiIiJiUWJrBk57e/t3Bt9RkidPjo2NzWtZ8Dt37ryWLQd48uQJJ0+eJCAggB9++AGAyMhIDAYDtra27Nixg/Lly7/zuCpTEREREZF4L0GCBHh4eLBz506T5Tt37qRkyZKvre/s7MzZs2c5ffq08dGuXTty5MjB6dOnKVas2HsdV5lxEREREbEo5pr0p3v37jRp0oTChQtTokQJZs+ezfXr12nXrh3wsuzl5s2bLFy4EGtra/LkyWOyfcqUKXFwcHht+dsoGBcRERERixJbNeMfql69ety/fx8fHx8CAwPJkycPW7ZsIWPGjAAEBga+c8zxD6VgXEREREQsirmCcYAOHTrQoUOHGJ/z8/N767ZD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52ttqVixIqlTp+aLL74gTZo0731NvCpt2rQMHTqUvn370rx5c7y8vPDz82PUqFFERkbSpEkTnjx5QuHChdm+fftrnS+j3Lhxgw0bNgAvh4iMbs+ePcZhMydOnIitrS1169YlJCSEChUq4OfnZ/JDaOzYsdja2tKkSRNCQkIoVqwYu3fvfu3Yo0aNokuXLly8eJH8+fOzYcMGY6YfIGHChPTp04eGDRty48YNSpcubRz+UUREJC6KGznt2GFliCvjvpjBtWvXyJQpEwEBAa8FXvJpBAcHkyZNGubNmxfvZqfcu3cvX331FQ8fPvzoU95H1ZCfmHv8ox5HLF+Rlv+7o6LrQcD0mujXsYkZWyKWYMS0Re81Et5/VSpt+Xev9B4O3dwdK/v5mHRvWixSZGQkt27dYvz48SRJkoSaNWuau0kiIiIisU7BuFik69evkylTJtKlS4efn59qmkVEROKR+DTOuCKct3B3d48zszd9bvTaQ7ly5eL9ayAiIvFTfPr+UzAuIiIiIhYlPmXGY20GThERERER+TDKjIuIiIiIRYlPM3AqGBcRERERixKfasZVpiIiIiIiYibKjIuIiIiIRYlPHTgVjIuIiIiIRVGZioiIiIiIfHTKjIuIiIiIRVGZioiIiIiImcSnoQ1VpiIiIiIiYibKjIuIiIiIRYmMRx04FYyLiIiIiEWJT2UqCsZFRERExKLEp8y4asZFRERERMxEmXERERERsSgqUxERERERMROVqYiIiIiIyEenzLiIiIiIWBSVqYiIiIiImInKVERERERE5KNTZlxERERELIrKVEREREREzMRgiDR3Ez4ZlamIiIiIiJiJMuMiIiIiYlEiVaYiIiIiImIehng0moqCcRERERGxKPEpM66acRERERERM1FmXEREREQsispURERERETMRDNwioiIiIjIR6fMuIiIiIhYFM3AKSIiIiJiJvGpZlxlKiIiIiIiZqLMuIiIiIhYlPg0zriCcRERERGxKCpTERERERGRj06ZcRERERGxKPFpnHEF4yIiIiJiUeJTmYqCcRERERGxKPGpA6dqxkVEREREzESZcRERERGxKCpTERERERExk/jUgVNlKiIiIiIiZqLMuIiIiIhYFEM86sCpYFxERERELIrKVERERERE5KNTZlxERERELIpGUxERERERMZP4VDOuMhURERERETNR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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Get pairwise dot product similarities\n",
    "dot_product_similarities = [[cosine_similarity([embeddings[i]], [embeddings[j]])[0][0] for i in range(len(embeddings))] for j in range(len(embeddings))]\n",
    "\n",
    "# Plot in 3x3 grid\n",
    "ax = sns.heatmap(dot_product_similarities, vmin=0, vmax=1,\n",
    "                 linewidths=1, linecolor='grey',\n",
    "                 xticklabels=texts,\n",
    "                 yticklabels=texts,\n",
    ")\n",
    "ax.set_xticklabels(labels=texts, rotation=45)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice that the dot product and cosine distance give nearly identical values. The reason for this is that the embedding is normalized (meaning each vector has norm equal to 1). When the embedding is not normalized, the dot product and cosine distance would give different values."
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "gpuClass": "standard",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "vscode": {
   "interpreter": {
    "hash": "1fb8019e3560b882083e525615cf48e713d3a7345a15eb723d805e91aa410aac"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
